#include<iostream>
#include"ringQueue.hpp"
#include"Sem.hpp"
#include<ctime>
#include<unistd.h>

using namespace std;

void* productor(void* args)
{
    RingQueue<int>* rq=(RingQueue<int>*)args;
    while(true)
    {
        sleep(1);
        int x=rand()%10+1;
        rq->push(x);
        cout<<"生产者："<<"["<<pthread_self()<<"]:"<<"生产 "<<x<<endl;
    }
}
void* consumer(void* args)
{
    RingQueue<int>* rq=(RingQueue<int>*)args;
    while(true)
    {
        sleep(1);
        int x;
        rq->pop(&x);
        cout<<"消费者: "<<"["<<pthread_self()<<"]"<<"消费 "<<x<<endl;
    }
}

int main()
{
    srand((uint64_t)time(nullptr)^getpid()^0xFF64);
    pthread_t c[2],p[3];
    RingQueue<int>* rq=new RingQueue<int>(7);

    pthread_create(c,nullptr,consumer,(void*)rq);
    pthread_create(c+1,nullptr,consumer,(void*)rq);
    pthread_create(p,nullptr,productor,(void*)rq);
    pthread_create(p+1,nullptr,productor,(void*)rq);
    pthread_create(p+2,nullptr,productor,(void*)rq);

    for(int i=0;i<2;i++)
    {
        pthread_join(c[i],nullptr);
    }
    for(int i=0;i<3;i++)
    {
        pthread_join(p[i],nullptr);
    }
    return 0;
}

// void* productor(void* args)
// {
//     RingQueue<int>* rq=(RingQueue<int>*)args;
//     while(true)
//     {
//         int x=rand()%10+1;
//         rq->push(x);
//         cout<<"生产:"<<" [ "<<pthread_self()<<" ]: "<<x<<endl;
//     }
//     return nullptr;
// }
// void* consumer(void* args)
// {
//     RingQueue<int>* rq=(RingQueue<int>*)args;
//     while(true)
//     {
//         sleep(5);
//         int x;
//         rq->pop(&x);
//         cout<<"消费:"<<" [ "<<pthread_self()<<" ]: "<<x<<endl;
//     }
// }

// int main()
// {
//     srand((uint64_t)time(nullptr)^getpid()^0xFF443);
//     pthread_t c[2],p[3];
//     RingQueue<int>* rq=new RingQueue<int>();

//     pthread_create(p,nullptr,productor,(void*)rq);
//     pthread_create(p+1,nullptr,productor,(void*)rq);
//     pthread_create(p+2,nullptr,productor,(void*)rq);

//     pthread_create(c,nullptr,consumer,(void*)rq);
//     pthread_create(c+1,nullptr,consumer,(void*)rq);
    

//     for(int i=0;i<2;i++)
//     {
//         pthread_join(c[i],nullptr);
//     }
//     for(int i=0;i<3;i++)
//     {
//         pthread_join(p[i],nullptr);
//     }
//     return 0;
// }

// void* productor(void* args)
// {

// }
// void* consumer(void* args)
// {

// }

// int main()
// {
//     pthread_t c[3],p[2];
//     RingQueue<int>* rq=new RingQueue<int>();
//     pthread_create(c,nullptr,consumer,(void*)rq);
//     pthread_create(c+1,nullptr,consumer,(void*)rq);
//     pthread_create(c+2,nullptr,consumer,(void*)rq);

//     pthread_create(p,nullptr,productor,(void*)rq);
//     pthread_create(p+1,nullptr,productor,(void*)rq);

//     for(int i=0;i<3;i++)
//     {
//         pthread_join(c[i],nullptr);
//     }
//     for(int i=0;i<2;i++)
//     {
//         pthread_join(p[i],nullptr);
//     }
//     return 0;
// }
//生产者和消费者通过操作队列来完成数据的读取和写入
// void* consumer(void* args)
// {
//     //消费者将数据取出
//     RingQueue<int>* rq=(RingQueue<int>*)args;
//     while(true)
//     {
//         sleep(1);
//         int x;
//         rq->pop(&x);
//         cout<<"消费"<<x<<"["<<pthread_self()<<"]"<<endl;
//     }
// }
// void* productor(void* args)
// {
//     //生产者负责将数据进行插入
//     RingQueue<int>* rq=(RingQueue<int>*)args;
//     while(true)
//     {
//         int x=rand()%10+1;
//         cout<<"生产"<<x<<"["<<pthread_self()<<"]"<<endl;
//         rq->push(x);
//     }
// }

// int main()
// {
//     srand((uint64_t)time(nullptr)^getpid());
//     RingQueue<int>* rq=new RingQueue<int>();

//     pthread_t c[3],p[2];
//     pthread_create(c,nullptr,consumer,(void*)rq);
//     pthread_create(c+1,nullptr,consumer,(void*)rq);
//     pthread_create(c+2,nullptr,consumer,(void*)rq);

//     pthread_create(p,nullptr,productor,(void*)rq);
//     pthread_create(p+1,nullptr,productor,(void*)rq);

//     for(int i=0;i<3;i++)
//     {
//         pthread_join(c[i],nullptr);
//     }
//     for(int i=0;i<2;i++)
//     {
//         pthread_join(p[i],nullptr);
//     }
//     return 0;
// }